<?php

/**
 * @class XQL_QueryPart
 * @extends pObject
 *
 * Egy lekérést vagy lekérésrészletet reprezentáló objektum osztálya. Az
 * ezzel az osztállyal példányosított lekérések és részletek közvetlenül
 * nem hajthatóak végre. Az osztály példányai viszont elérik a
 * lekérés-gyorsítótárat, aminek köszönhetően egy-egy összetettebb lekérés is
 * könnyebben és praktikusabban gyorstárazható.
 */
class XQL_QueryPart
{
	/**
	 * @var XQL_Object
	 */
	protected $actionObject;

	/**
	 * @var XQL_Connection
	 */
	protected $connection;

	/**
	 * @var string
	 */
	protected $name;

	/**
	 * @var string
	 */
	protected $query;

	/**
	 * Konstruktor.
	 * Hozzárendeli az adatbáziskapcsolatot az objektumhoz.
	 *
	 * @param string $connectionAlias
	 * @access public
	 */
	public function __construct($connectionAlias='default')
	{
		$this->connection = XQL_Manager::getConnection($connectionAlias);
	}

	/**
	 * @return XQL_Query
	 */
	static public function create($connectionAlias='default')
	{
		return new XQL_QueryPart($connectionAlias);
	} // static method

	/**
	 * Beállítja a lekérésrészlet nevét.
	 *
	 * A lekérés nevének egy alkalmazáson belül teljesen egyedinek kell lennie.
	 * A beállítást követően a metódus megkísérli betölteni a névnek megfelelő
	 * lekérést a gyorsítótárból. A gyorsítótárba csak azok a lekérések kerülnek,
	 * amelyeknek nevük is van!
	 *
	 * @return XQL_Query
	 */
	public function setName($name)
	{
		$this->name = $name;

		if (XQL_Manager::exists($name))
		{
			$this->query = XQL_Manager::get($name);
		} // if

		return $this;
	}

	/**
	 * Törli a lekérés nevét.
	 *
	 * @return XQL_Query
	 */
	public function clearName()
	{
		$this->name = NULL;
		return $this;
	}

	/**
	 * Megállapítja, hogy a lekérést gyorsítótárból töltötte-e be a rendszer.
	 *
	 * @return bool
	 */
	public function isQueryLoaded()
	{
		return isset($this->query);
	}

	/**
	 * Hozzárendeli a lekéréshez a lekérést felépítő objektumot.
	 *
	 * @return XQL_Query
	 */
	public function setAction($action)
	{
		$this->actionObject = $action;
		$this->query = NULL;
		return $this;
	}

	/**
	 * Hozzárendeli a lekéréshez a lekérés string-et.
	 *
	 * @return string
	 */
	public function setQuery($query)
	{
		$this->query = $query;
		return $this;
	}

	/**
	 * Visszaadja a lekérést mint string.
	 *
	 * @param bool $forceReload Mindenképp újraépíti (vagy újra betölti) a
	 * lekérést.
	 * @return string
	 */
	public function getQuery($forceReload=FALSE)
	{
		$result = FALSE;
		$needReload = ($forceReload? TRUE : !$this->isQueryLoaded());
		if ($needReload)
		{
			if (is_null($this->name) or !XQL_Manager::exists($this->name))
			{
				$this->query = (string)$this->actionObject;
			}
			else
			{
				$this->query = XQL_Manager::get($this->name);
			}
		}

		$result = $this->query;

		return $result;
	}

	/**
	 * Visszaadja a lekéréshez tartozó SQL objektum struktúra objektumát.
	 *
	 * @return XQL_Object
	 */
	public function getAction()
	{
		return $this->actionObject;
	}
}

?>